package main

import (
	"log"
	"os"

	"github.com/gotk3/gotk3/glib"
	"github.com/gotk3/gotk3/gtk"
)
func errlog(err error){	if err != nil {	log.Fatal( err)}}
func main() {
	const appID = "com.github.gotk3.gotk3-examples"
	application, err := gtk.ApplicationNew(appID, glib.APPLICATION_FLAGS_NONE);	errlog( err)

	application.Connect("activate", func() {//映射app激活事件：创建一个窗口
		win := newWindow(application)  //给应用程序创建第一个窗口

		aNew := glib.SimpleActionNew("new", nil)//创建一个动作映射到 new事件
		aNew.Connect("activate", func() {  //映射此动作的激活回调函数
			newWindow(application).ShowAll() //创建一个匿名窗口
		})
		application.AddAction(aNew)  //给应用添加这个‘创建’动作

		aQuit := glib.SimpleActionNew("quit", nil)//创建一个动作映射到 quit事件
		aQuit.Connect("activate", func() { //映射此动作的激活回调函数
			application.Quit()
		})
		application.AddAction(aQuit) //给应用添加这个‘退出‘动作

		win.ShowAll()  //应用程序的第一个窗口显示、进入窗口消息处理循环
	})

	os.Exit(application.Run(os.Args))//进入应用程序处理信号循环
}

func newWindow(application *gtk.Application) *gtk.ApplicationWindow {
	win, err := gtk.ApplicationWindowNew(application)//创建一个顶级窗口ApplicationWindow//;errlog( err)

	win.SetTitle("GOTK3 动作示例") // 顶级窗口的title并没有显示，而被header的title覆盖了

	lbl, err := gtk.LabelNew("测试menubutton的action")//实例化一个label //;errlog( err)

	//创建一个headerbar 即
	header, err := gtk.HeaderBarNew();	errlog( err)
	header.SetShowCloseButton(true);header.SetTooltipText("这是程序员黑洞")
	header.SetTitle("GOTK3")
	header.SetSubtitle("Actions 示例")

	//创建一个 menu button
	mbtn, err := gtk.MenuButtonNew()

	// Set up the menu model for the button
	menu := glib.MenuNew()
	if menu == nil {		log.Fatal("创建失败 menu (nil)")	}
	// 动作前缀'app'表示映射到 application 的动作
	// 动作前缀'win'表示映射到 当前window (特指 ApplicationWindow)
	// 其他动作前缀表示映射到组件 widgets via InsertActionGroup
	menu.Append("New Window", "app.new")  //引用application的new action//gtk.Menu则不支持这种写法
	menu.Append("Close Window", "win.close")//引用当前窗口的close action
	menu.Append("Custom Panic", "custom.panic")//引用custom 的panic action
	menu.Append("Quit", "app.quit") //引用app的quit action

	//创建一个动作 "win.close"
	aClose := glib.SimpleActionNew("close", nil)
	aClose.Connect("activate", func() {	win.Close()	})
	win.AddAction(aClose)

	// Create and insert custom action group with prefix "custom"
	customActionGroup := glib.SimpleActionGroupNew()
	win.InsertActionGroup("custom", customActionGroup) //自定义动作组绑定到窗口

	// 在 custom action group创建动作
	aPanic := glib.SimpleActionNew("panic", nil)
	aPanic.Connect("activate", func() {
		lbl.SetLabel("PANIC!")
	})
	customActionGroup.AddAction(aPanic) //自定义动作加到自定义动作组
	win.AddAction(aPanic) //自定义动作同时加到窗口
	mbtn.SetMenuModel(&menu.MenuModel)  //菜单按钮和 menu 关联

	header.PackStart(mbtn) //按钮再加到header组件中，第一个添加就会显示在最左边

	// Assemble the window
	win.Add(lbl)            //
	win.SetTitlebar(header) // headerbar 的title 覆盖掉win的title
	win.SetPosition(gtk.WIN_POS_MOUSE)
	win.SetDefaultSize(600, 300)
	return win
}
